/*
Dominique Jannone
Guillaume Marre
Yohan Ojeda
Laurent Schiavon
*/
package controleur;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.media.rtp.RTPManager;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.Port;
import javax.swing.RepaintManager;

import Econf_Audio.ControlSound;
import Econf_Audio.Emetteur_client;
import Econf_Audio.Receveur_client;

import model.*;
import vue.*;

public class ControlConference implements ActionListener {
	
	// Attributs
	int etatControl;
	private Fenetre fenetre;
	private String idConf;
	private String DN;
	private String action;
	private eConf eConf;
	//log
		public static final Logger logger = Logger.getLogger(ControlConference.class.getName());

	
	// Observateur
	
	public ControlConference(Fenetre fe, eConf eConf) {
		fenetre = fe;
		this.eConf = eConf;
	}
	
	public ControlConference(Fenetre fe, String idConf, String DN, String action, eConf eConf) {
		fenetre = fe;
		this.idConf = idConf;
		this.DN = DN;
		this.action = action;
		this.eConf = eConf;
	}
	
	public ControlConference(Fenetre fe, String action, eConf eConf) {
		fenetre = fe;
		this.action = action;
		this.eConf = eConf;
	}

 // Définition des actions
	public void actionPerformed(ActionEvent arg0) {
		
		// Détermination du type d'action "pour la conférence"
		if (action.equals("Play") | action.equals("Stop")){
			
			if (action.equals("Play")){
				// Stop l'emetteur du conférencier
					RTPManager[] emetteur = Emetteur_client.rtpm;
						emetteur[0].dispose();
						// Close Thread
						eConf.getConference().getEmetteur().closeThread();
			}
			
			logger.log(Level.INFO,"Action Play or Stop, conférence: "+idConf+" - Utilisateur: "+DN);
			String description = action+"@"+idConf+"@"+DN;
			// Envoie au serveur une demande Conférence (idConf, DN, action)
			eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_PLAY_STOP_DemandeParole, description);
			
			eConf.RecoiReponseDuServeur();
			
			if (action.equals("Stop")){
				// Stop l'emetteur du conférencier
					Emetteur_client emetteur = new Emetteur_client(eConf.getPortEmetteurDuServeur(), eConf.getIp_Serveur());
					eConf.getConference().setEmetteur(emetteur);
					try {
						Thread.sleep(2000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						logger.log(Level.SEVERE,e.getClass() + ": " +  e.getMessage(), e);
					}
					emetteur.start();
			}
			
			logger.log(Level.INFO,"Quit Control Conférence");
			
		}
		
		// Détermination du type d'action "pour la conférence"
		if (action.equals("DemandeParole")){
			
			logger.log(Level.INFO,"Action DemandeParole, conférence: "+idConf+" - Utilisateur: "+DN);
			// Get info of user
				eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_INFOS_PERSONELLES_UTILISATEUR, "Demande informations personnelles utilisateur courant");
				Object[] profile = eConf.ReceptionObjet1DFromServer();
				DN = profile[0].toString()+" "+profile[1].toString();
			
			String description = action+"@"+idConf+"@"+DN;
			// Envoie au serveur une demande Conférence (idConf, DN, action)
			eConf.EnvoiDemandeAuServeur(Constantes.DEMANDE_PLAY_STOP_DemandeParole, description);
			
			eConf.RecoiReponseDuServeur();
			logger.log(Level.INFO,"Quit Control Conférence");
			
		}
		
		// Détermination du type d'action "Volume muet"
		if (action.equals("volumeMuet")){
			logger.log(Level.INFO,"Action volumeMuet");
			// Envoie au serveur une demande Orateur (idConf, DN)
			ControlSound sound = new ControlSound();
			try {
				sound.modifierVolume(0,Port.Info.LINE_OUT, Port.Info.HEADPHONE, Port.Info.SPEAKER);
			} catch (LineUnavailableException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		// Détermination du type d'action "Volume up"
		if (action.equals("volumeUp")){
			logger.log(Level.INFO,"Action volumeUp");
			// Envoie au serveur une demande Orateur (idConf, DN)
			ControlSound sound = new ControlSound();
			try {
				sound.modifierVolume(100,Port.Info.LINE_OUT, Port.Info.HEADPHONE, Port.Info.SPEAKER);
			} catch (LineUnavailableException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
		// Détermination du type d'action "Volume up"
		if (action.equals("volumeDown")){
			logger.log(Level.INFO,"Action volumeDown");
			// Envoie au serveur une demande Orateur (idConf, DN)
			ControlSound sound = new ControlSound();
			try {
				sound.modifierVolume(50,Port.Info.LINE_OUT, Port.Info.HEADPHONE, Port.Info.SPEAKER);
			} catch (LineUnavailableException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
	}
}